interface Empty<T>{}

let x:Empty<number>
let y:Empty<string>

x = y
y=x

interface NotEmpty<T>{
    data:T;
}

let x2:NotEmpty<number>
let y2:NotEmpty<string>
x2 = y2 // string 和 number 类型不匹配


// 不指定泛型参数的时候 默认把泛型参数 当作 any 比较 然后用结果类型进行比较，就像上面第一个例子。
let identity = function<T>(x: T): T {
    return x
}

let reverse = function<U>(y: U): U {
    return y
}

identity = reverse;  // OK, because (x: any) => any matches (y: any) => any
